#!/bin/sh

set -e

# adjust bl33 load address in existing FIP

FDTGET=${FDTGET:-fdtget}
FDTPUT=${FDTPUT:-fdtput}

if [ "$1" != "-l" ] || [ "$#" -ne 3 ]; then
	echo "USAGE: $0 -l NT_LOAD_ADDR FIP" 1>&2
	exit 1
fi

NEW_LOAD_ADDR=$(($2))
FIP=$3
FWCONFIG=".$FIP.fw-config.bin"

fiptool unpack --fw-config "$FWCONFIG" --force "$FIP"

MAX_SIZE="$($FDTGET -t u $FWCONFIG /dtb-registry/nt_fw max-size)"
set $($FDTGET -t u $FWCONFIG /dtb-registry/nt_fw load-address)
ENTRY=$1
OLD_LOAD_ADDR=$2

if [ $NEW_LOAD_ADDR -lt $OLD_LOAD_ADDR ] ||
   [ $NEW_LOAD_ADDR -ge $((OLD_LOAD_ADDR + MAX_SIZE)) ]; then
	printf "New load address 0x%08x out of bounds [0x%08x-0x%08x)\n" \
		$NEW_LOAD_ADDR $OLD_LOAD_ADDR $((OLD_LOAD_ADDR + MAX_SIZE)) 1>&2
	exit 1
fi

$FDTPUT -t u $FWCONFIG /dtb-registry/nt_fw load-address $ENTRY $NEW_LOAD_ADDR
$FDTPUT -t u $FWCONFIG /dtb-registry/nt_fw max-size \
	$((MAX_SIZE + OLD_LOAD_ADDR - NEW_LOAD_ADDR))

fiptool update $FIP --fw-config $FWCONFIG

rm $FWCONFIG
